//-----------------------------------------------------------------------------
// Filename: ByteBuffer.cs
//
// Description: Provides some useful methods for working with byte[] buffers.
//
// License: 
// This software is licensed under the BSD License http://www.opensource.org/licenses/bsd-license.php
//
// Copyright (c) 2006 Aaron Clauson (aaronc@blueface.ie), Blue Face Ltd, Dublin, Ireland (www.blueface.ie)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are permitted provided that 
// the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 
// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following 
// disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of Blue Face Ltd. 
// nor the names of its contributors may be used to endorse or promote products derived from this software without specific 
// prior written permission. 
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 
// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
// POSSIBILITY OF SUCH DAMAGE.
//-----------------------------------------------------------------------------

using System;
using System.Text;

#if UNITTEST
using NUnit.Framework;
#endif

namespace BlueFace.VoIP.Net
{
	public class ByteBuffer
	{
		/// <summary>
		/// Searches a buffer for a string up until a specified end string.
		/// </summary>
		/// <param name="buffer"></param>
		/// <param name="find"></param>
		/// <param name="end"></param>
		/// <returns></returns>
		public static bool HasString(byte[] buffer, string find, string end)
		{
			if(buffer == null || buffer.Length == 0 || find == null || find.Trim().Length == 0)
			{
				return false;
			}
			else
			{
				byte[] findArray = Encoding.ASCII.GetBytes(find);
				byte[] endArray = (end != null) ? Encoding.ASCII.GetBytes(end) : null;

				int findPosn = 0;
				int endPosn = 0;

				for(int index=0; index<buffer.Length; index++)
				{
					if(buffer[index] == findArray[findPosn])
					{
						findPosn++;
					}
					else
					{
						findPosn = 0;
					}

					if(endArray != null && buffer[index] == endArray[endPosn])
					{
						endPosn++;
					}
					else
					{
						endPosn = 0;
					}

					if(findPosn == findArray.Length)
					{
						return true;
					}
					else if(endArray != null && endPosn == endArray.Length)
					{
						return false;
					}
				}

				return false;
			}
		}

		#region Unit testing.

		#if UNITTEST
	
		[TestFixture]
		public class SIPURIUnitTest
		{
			[TestFixtureSetUp]
			public void Init()
			{
				
			}

			
			[TestFixtureTearDown]
			public void Dispose()
			{			
				
			}

			
			[Test]
			public void SampleTest()
			{
				Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);
				
				Assert.IsTrue(true, "True was false.");
			}

			[Test]
			public void HasStringUnitTest()
			{
				Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

				byte[] sample = Encoding.ASCII.GetBytes("The quick brown fox jumped over...");

				bool hasFox = ByteBuffer.HasString(sample, "fox", null);
				
				Assert.IsTrue(hasFox, "The string was not found in the buffer.");
			}

			[Test]
			public void NotBeforeEndUnitTest()
			{
				Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

				byte[] sample = Encoding.ASCII.GetBytes("The quick brown fox jumped over...");

				bool hasFox = ByteBuffer.HasString(sample, "fox", "brown");
				
				Assert.IsTrue(!hasFox, "The string was not found in the buffer.");
			}
		}

		#endif

		#endregion
	}
}
